package com.zrc.japktool.ui.view;

import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.layout.StackPane;
import org.fxmisc.flowless.VirtualizedScrollPane;
import org.fxmisc.richtext.InlineCssTextArea;
import org.fxmisc.richtext.model.StyleSpans;
import org.fxmisc.richtext.model.StyleSpansBuilder;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class RichTextFXLogView extends StackPane {
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    private final InlineCssTextArea logArea;
    private final VirtualizedScrollPane<InlineCssTextArea> scrollPane; // 滚动容器

    // 颜色常量：已更新为你指定的颜色值
    private static final String COLOR_INFO = "#8A8A8A";    // 灰色（INFO）
    private static final String COLOR_WARN = "#FFC107";    // 黄色（WARN）
    private static final String COLOR_DEBUG = "#4CAF50";   // 绿色（DEBUG）
    private static final String COLOR_ERROR = "#F44336";   // 红色（ERROR）
    private static final String COLOR_TIP = "#9C27B0";     // 紫色（TIP）

    public RichTextFXLogView() {
        // 1. 初始化日志区域
        logArea = new InlineCssTextArea();
        configureLogArea();

        // 2. 用 VirtualizedScrollPane 包裹日志区域，自动生成滚动条
        scrollPane = new VirtualizedScrollPane<>(logArea);

        // 3. 将滚动容器添加到当前 StackPane 中
        getChildren().add(scrollPane);

        // 4. 绑定滚动容器大小，使其随父容器拉伸
        scrollPane.prefWidthProperty().bind(this.prefWidthProperty());
        scrollPane.prefHeightProperty().bind(this.prefHeightProperty());
        scrollPane.maxWidthProperty().bind(this.maxWidthProperty());
        scrollPane.maxHeightProperty().bind(this.maxHeightProperty());
    }

    private void configureLogArea() {
        logArea.setEditable(false);
        logArea.setStyle(
                "-fx-font-family: 'Consolas', 'Monaco', monospace; " +  // 等宽字体：确保每个字符宽度一致
                        "-fx-font-size: 12px; " +
                        "-fx-background-color: #ffffff; " +  // 白色背景，确保颜色可见
                        "-fx-control-inner-background: #ffffff;");
        logArea.setPrefHeight(400); // 初始高度，超出时显示滚动条
    }

    // 对外提供获取根节点的方法（供 FXML 或控制器使用）
    public Node getRootNode() {
        return this;
    }

    // 原有日志方法不变...
    public void clear() {
        Platform.runLater(logArea::clear);
    }

    public void info(String msg) {
        addLog("INFO", msg, COLOR_INFO);
    }

    public void warn(String msg) {
        addLog("WARN", msg, COLOR_WARN);
    }

    public void debug(String msg) {
        addLog("DEBUG", msg, COLOR_DEBUG);
    }

    public void error(String msg) {
        addLog("ERROR", msg, COLOR_ERROR);
    }

    public void tip(String msg) {
        addLog("TIP", msg, COLOR_TIP);
    }

    private void addLog(String level, String msg, String color) {
        String time = "[" + TIME_FORMATTER.format(LocalDateTime.now()) + "]";
        // 关键1：调用 formatLevel 补空格，统一级别文字长度（均为5个字符）
        String fixedLenLevel = formatLevel(level);
        String levelTag = "[" + fixedLenLevel + "]"; // 最终级别标签：[INFO ]、[WARN ]、[DEBUG] 等
        String logLine = time + " " + levelTag + " " + msg + "\n";

        // 关键2：重新计算长度（固定长度后，levelLength 统一为 7："["+5字符+"]" + 1个空格）
        int timeLength = time.length() + 1; // 时间 + 时间后的空格（如 "[2025-10-13 10:00:00] "）
        int levelLength = levelTag.length() + 1; // 级别标签 + 标签后的空格（如 "[INFO ] "）
        int contentLength = logLine.length() - timeLength - levelLength; // 日志内容

        Platform.runLater(() -> {
            int startPos = logArea.getLength();
            logArea.appendText(logLine);

            // 时间戳、级别、内容颜色一致
            StyleSpans<String> styleSpans = new StyleSpansBuilder<String>()
                    .add("-fx-fill: " + color + ";", timeLength)  // 时间戳颜色 = 级别颜色
                    .add("-fx-fill: " + color + "; -fx-font-weight: bold;", levelLength)  // 级别（加粗+统一颜色）
                    .add("-fx-fill: " + color + ";", contentLength)  // 内容颜色 = 级别颜色
                    .create();

            logArea.setStyleSpans(startPos, styleSpans);
            // 滚动到底部
            logArea.scrollYToPixel(logArea.getTotalHeightEstimate());
        });
    }

    /**
     * 辅助方法：补空格统一级别文字长度（均为5个字符）
     * 最长级别为 "DEBUG" 和 "ERROR"（5个字符），其他级别补空格至5个字符
     */
    private String formatLevel(String level) {
        return switch (level) {
            case "INFO" -> "I";
            case "WARN" -> "W";
            case "TIP" ->  "T";
            case "DEBUG"-> "D";
            case "ERROR"-> "E" ;
            default -> level; // 异常级别默认返回原字符串
        };
    }
}